// class Parent {
//   constructor() {
//     // 定义在父类的实例属性
//     this.pNum = 2;
//   }

//   // 定义在 Parent.prototype 上的 function
//   pFn() {
//     console.log("parent normal fn");
//   }

//   // 定义在 Parent.prototype 上的 function
//   pFn2() {
//     console.log("parent normal fn2");
//   }

//   // 静态方法，只能 Parent.pStaticFn() 调用
//   static pStaticFn() {
//     console.log("parent static fn");
//   }
// }

// class Son extends Parent {
//   constructor() {
//     // 这里的 super 指的是父类的构造函数
//     super();

//     // 这里的 super 指的是指向父类的原型对象
//     super.pFn();

//     // 因为 super 指向父类的原型对象，所以定义在父类实例上的方法或属性，是无法通过 super 调用的
//     console.log("super.pNum: ", super.pNum); // undefined
//   }

//   sonFn() {
//     // 普通方法中的 super 指的是指向父类的原型对象
//     super.pFn2();
//   }

//   static sonStaticFn() {
//     // 静态方法中的 super 指的是 父类
//     super.pStaticFn();
//   }
// }

// const son = new Son(); // log:  parent normal fn

// son.sonFn(); // log: parent normal fn2
// Son.sonStaticFn(); // log: parent static fn

// const _instance = (obj, check) => {
//   if (!obj || typeof obj !== "object") return false;

//   //   if (obj.__proto__ === check.prototype) return true;

//   while (obj.__proto__ && obj.__proto__ !== check.prototype) {
//     obj.__proto__ = obj.__proto__.prototype;
//   }

//   return !!obj.__proto__;
// };

// console.log(_instance(son, Son));

// const obj = {};
// const { log } = console;

// log("obj.toString(): ", obj.toString()); // log: [object Object]
// log("obj.toString(): ", obj.valueOf()); // log: {}

var pureArrowFn = () => {};
var funArrow = function () {};
function func() {}

const { dir } = console;

dir(pureArrowFn.prototype);
dir(funArrow.prototype);
dir(func.prototype);
